package com.ccsoft.multds.config;

import com.ccsoft.multds.utils.MultDSSwitcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @author chanchaw
 * @create 2022-09-16 12:45
 */
@Component
@Primary
public class DynamicDataSource extends AbstractRoutingDataSource {

    public static ThreadLocal<MultDSSwitcher> multDSSwitcher = new ThreadLocal<>();

    @Autowired
    DataSource dataSource1;
    @Autowired
    DataSource dataSource2;

    // 返回当前要用的数据源的标识
    // 标识 = targetDataSources(是个 Map 对象) 中的 key
    // spring 容器根据该标识在 targetDataSources 查询并返回对应的 DataSource
    @Override
    protected Object determineCurrentLookupKey() {
        return multDSSwitcher.get();
    }

    // 实例化本对象后执行的初始化操作
    @Override
    public void afterPropertiesSet() {

        // 构建全部数据源
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(MultDSSwitcher.WRITE,dataSource1);
        targetDataSources.put(MultDSSwitcher.READ,dataSource2);
        super.setTargetDataSources(targetDataSources);

        // 设置默认数据源
        super.setDefaultTargetDataSource(dataSource1);

        // 父类中将 targetDataSources 数据复制给 resolvedDataSources
        // 最终由 resolvedDataSources 真正访问数据库
        // 所以复写该方法时仍然要调用父类方法
        super.afterPropertiesSet();
    }
}
